export function parseTime(time, cFormat) {
  if (arguments.length === 0) {
    return null;
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
  let date;
  if (typeof time === 'object') {
    date = time;
  } else {
    if (('' + time).length === 10) time = parseInt(time) * 1000;
    date = new Date(time);
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key];
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value];
    }
    if (result.length > 0 && value < 10) {
      value = '0' + value;
    }
    return value || 0;
  })
  return time_str;
}

export function formatTime(time, option) {
  time = +time * 1000;
  const d = new Date(time);
  const now = Date.now();

  const diff = (now - d) / 1000;

  if (diff < 30) {
    return '刚刚';
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + '分钟前';
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前';
  } else if (diff < 3600 * 24 * 2) {
    return '1天前';
  }
  if (option) {
    return parseTime(time, option);
  } else {
    return (
      d.getMonth() +
      1 +
      '月' +
      d.getDate() +
      '日' +
      d.getHours() +
      '时' +
      d.getMinutes() +
      '分'
    );
  }
}

export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result;

  const later = function() {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp;

    // 上次被包装函数被调用时间间隔last小于设定时间间隔wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last);
    } else {
      timeout = null;
      // 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      }
    }
  }

  return function(...args) {
    context = this;
    timestamp = +new Date();
    const callNow = immediate && !timeout;
    // 如果延时不存在，重新设定延时
    if (!timeout) timeout = setTimeout(later, wait);
    if (callNow) {
      result = func.apply(context, args);
      context = args = null;
    }

    return result;
  }
}

export function createAll(args) {
  return Promise.all(args);
}

/* 根据出生日期算出年龄 */
export function jsGetAge(strBirthday) {
  let returnAge;
  const strBirthdayArr = strBirthday.split('-');
  const birthYear = parseInt(strBirthdayArr[0]);
  const birthMonth = parseInt(strBirthdayArr[1]);
  const birthDay = parseInt(strBirthdayArr[2]);

  const d = new Date();
  const nowYear = d.getFullYear();
  const nowMonth = d.getMonth() + 1;
  const nowDay = d.getDate();
  // console.log(nowYear, nowMonth, nowDay, birthYear, birthMonth, birthDay)

  if (nowYear === birthYear) {
    returnAge = 0; // 同年 则为0岁
  } else {
    const ageDiff = nowYear - birthYear; // 年之差
    if (ageDiff > 0) {
      if (nowMonth === birthMonth) {
        const dayDiff = nowDay - birthDay; // 日之差
        if (dayDiff < 0) {
          returnAge = ageDiff - 1;
        } else {
          returnAge = ageDiff;
        }
      } else {
        const monthDiff = nowMonth - birthMonth; // 月之差
        if (monthDiff < 0) {
          returnAge = ageDiff - 1;
        } else {
          returnAge = ageDiff;
        }
      }
    } else {
      returnAge = -1; // 返回-1 表示出生日期输入错误 晚于今天
    }
  }
  return returnAge; // 返回周岁年龄
}

/* 根据对象的属性进行排序 */
export function objSort(prop) {
  return function(obj1, obj2) {
    let val1 = obj1[prop];
    let val2 = obj2[prop];
    if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
      val1 = Number(val1);
      val2 = Number(val2);
    }
    if (val1 < val2) {
      return -1;
    } else if (val1 > val2) {
      return 1;
    } else {
      return 0;
    }
  }
}

/**
 * @param {Function} 校验图片是否符合规则
 * @param {number} wait
 * @param {boolean} immediate
 * @return {*}
 */
export default async function checkImageSize(url, width, height) {
  // console.log(url)
  // url = 'https://service-emhatyrq-1251017581.gz.apigw.tencentcs.com/test/cars-pai/public/attachment/default/temp.png'
  const img = new Image()
  img.src = url
  await img.onload
  // console.log(img.width, img.height)
  if ((width / height) === (img.width / img.height)) {
    return img.width + 'px * ' + img.height + 'px'
  }
  // if (img.width === width && img.height === height) {
  //   return true;
  // }
  return false
}

/**
 * @param {Function} 校验是否有权限
 * @return {*}
 */
export function queryMatch(data) {
  let result = false;
  this.$store.getters.permissionId.forEach(item => {
    if (item === data) {
      result = true;
    }
  })
  return result;
}

/**
 * @param {Function} 获取url所带参数
 * @param {number} wait
 * @param {boolean} immediate
 * @return {*}
 */
export function getUrlPramas(variable) {
  const url = decodeURI(window.location.href);
  const query = url.substring(url.indexOf('?') + 1);
  const vars = query.split('&');
  for (let i = 0; i < vars.length; i++) {
    const pair = vars[i].split('=');
    if (pair[0] === variable) {
      return pair[1];
    }
  }
  return (false);
}

/**
 * @param {Function} 文件转base64
 */
import { $config } from 'vue-element-simple';
export function fileToBase64 (file) {
  return new Promise(function (resolve) {
    if ($config.ENV === 'CLOUD') {
      const fileReader = new FileReader();
      if (file) {
        fileReader.readAsDataURL(file);
      }
      fileReader.onload = () => {
        const base64Str = fileReader.result;
        const params = {
          name: file.name,
          size: file.size,
          type: file.type,
          content: base64Str.split(',')[1]
        };
        resolve(JSON.stringify(params));
      };
    } else {
      resolve(file);
    }
  })
}
